iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 27
0
自我挑戰組

iOS 新手開發的大小事系列 第 27

Day 27: iOS View Controller Life Cycle (生命週期)

  • 分享至 

  • xImage
  •  

前情提要

昨天介紹了 App 的生命週期,接著今天要介紹的是 view controller 的生命週期,今天的介紹會在不同的方法中加入印出訊息,這樣更有助於我們充分的了解各方法是在什麼時候展現他的功能。

進入主題

從上圖可了解完整的 view controller 生命週期。
View controller 會經過以下幾個方法的運作

  • init
  • loadView
  • viewDidLoad
  • viewWillAppear
  • viewDidApper
  • viewWillDisappear
  • viewDidDisappear

以下將介紹 view 主要幾種方法的運作週期

viewDidLoad: 當 view 被載入到記憶體後,但畫面未被顯示之前,就會呼叫 viewDidLoad。我們通常會覆寫 (overrider) 這方法來執行額外在 view 上的初始化。

viewWillAppear: 這方法是當在 view 將呈現在畫面,且還沒有配置任何動畫以顯示 view 之前。我們可以重寫這個方法來執行與 view 關聯的自定義任務。例如,我們可以使用此方法更改狀態欄的方向或樣式,以與所顯示 view 的方向或樣式進行協調。

viewDidApper: 在 viewWillAppear 結束後,即 view 被載入後到 view controller 後,就會載入這個方法。同樣地,我們可以透過重寫來增加任務到已經呈現的 view。

viewWillDisappear: 這個方法是當 view 將被移除,且動畫開始執行前呼叫的。我們可以重寫這個方法來改變 view 的各種狀態。如我們可以將被改變的狀態欄還原回來。

viewDidDisappear: 當 view 被移除,會呼叫此方法,我們可以覆載此方法以執行與解除或隱藏 view 相關的其他任務。

實際測試

利用兩個畫面的切換,來了解各個方法運作週期。
先建立一個簡單雙畫面的 app:

分別在兩個 ViewController 中寫入以下的程式碼

  • View Controller A:
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        print("View A did load")
    }

    override func viewWillAppear(_ animated: Bool) {
        print("View A will appear")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        print("View A did appear")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        print("View A will disappear")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        print("View A did disappear")
    }
}
  • View Controller B:
class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        print("View B did load")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        print("View B will appear")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        print("View B did appear")
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        print("View B will disappear")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        print("View B did disappear")
    }

}

一開始執行後即出現 view A

並印出以下三行,由此可知 view A 的個函數的生命週期

View A did load
View A will appear
View A did appear

接著由 view A 切換至 view B

則印出以下訊息,由以下訊息可以明顯知道 View B 和 View A 是穿插準備顯示及準備消失的

View B did load
View A will disappear
View B will appear
View A did disappear
View B did appear

最後再由 View B 切換回 View A

View B will disappear
View A will appear
View B did disappear
View A did appear

由以上實際的操作可以加深對各個 view 的運作週期的了解,並且知道 viewDidLoad() 在實際執行時只會在一開始有作用,即對畫面初始化完成後,後續的畫面運作,再也不會呼叫到此方法。


上一篇
Day 26: iOS App Life Cycle (生命週期)
下一篇
Day 28: 轉場到下一個 View
系列文
iOS 新手開發的大小事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
陳董粉絲
iT邦新手 5 級 ‧ 2019-10-17 15:09:10

在viewWillAppear跟viewDidAppear中間還有
viewWillLayoutSubviews,viewDidLayoutSubviews
在某些狀況下會用到這兩個

Jes iT邦新手 5 級 ‧ 2019-10-17 16:02:27 檢舉

謝謝告知,因為查到的資料只有列出以上寫的

我要留言

立即登入留言